package com.study.spark.scala.sql

import org.apache.spark.sql.SparkSession

/**
 * 字符串操作
 *
 * @author stephen
 * @date 2019-09-27 18:22
 */
object StringFunctionDemo {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder()
      .appName("StringFunctionDemo")
      .master("local[*]")
      .getOrCreate()

    // 隐式转换
    import spark.implicits._
    import org.apache.spark.sql.functions._

    val df = spark.createDataset(Seq(("aaa"), ("abc"), ("aabbc"), ("bbcc"), ("ccc"))).toDF("key1")

    // 字符串定位
    df.select(
      instr($"key1", "b"),
      locate("b", $"key1"),
      // 指定开始定位位置
      locate("b", $"key1", 3)
    ).show()

    // 两个参数有一个为null则返回结果为null
    df.select(instr($"key1", null), locate(null, $"key1")).show()

    // 格式化字符串
    df.select(format_string("wahaha, value is [%s]", $"key1").as("sentence")).show(false)

    // translate函数，用来做单个字符的翻译，注意，是单个字符。
    df.select($"key1", translate($"key1", "abc", "123")).show()

    // 正则提取
    df.select($"key1", regexp_extract($"key1", "b(.*?)c", 1)).show()
    // 正则替换
    df.select($"key1", regexp_replace($"key1", "a{2,3}", "111_")).show()

    // 处理相似度的函数
    //levenshtein函数，就是求编辑距离
    df.select(levenshtein(lit("aaa"), lit("aba")), levenshtein(lit("aaa"), lit("bab"))).limit(1).show()
    // soundex函数，把字符串编码成4个字节，发音相似的词编码会相似
    df.select(soundex(lit("hello")), soundex(lit("hollow")), soundex(lit("how"))).limit(1).show()

    // initcap: 把字段的第一个字母变大写
    // ascii: 计算字段的第一个字母的ascii码值
    // lpad,rpad：在字符串左右两侧补字符
    df.select($"key1", initcap($"key1"), ascii($"key1"),lpad($"key1", 5,"*")).show()

    spark.stop()
  }
}
